home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / DELPHI32 / SYS_TOOL / MULTI020 / MPFOSSIL.PAS < prev    next >
Pascal/Delphi Source File  |  1993-09-07  |  4KB  |  170 lines

  1. unit MPFossil;
  2. { Provide clients which connect pipes to fossils }
  3. interface
  4. uses asms, multi, mpipes
  5. {$IFDEF DEBUG}
  6.      , nconv
  7. {$ENDIF};
  8.  
  9. procedure AttachFossilInTask(com : byte; m : pPipe);
  10. { Start client which feeds data from the FOSSIL into the pipe. }
  11.  
  12. procedure AttachFossilOutTask(com : byte; m : pPipe);
  13. { Start client which feeds data from the pipe to the FOSSIL. }
  14.  
  15. implementation
  16.  
  17. const commparams : array[0..15] of byte =
  18.   (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
  19.  
  20. procedure FossilInTask(var m); far;
  21. var
  22.   com : byte absolute m;
  23.   p : pPipe;
  24.   w : word;
  25. label endoftask;
  26. begin
  27.   p := pointer(meml[seg(m):ofs(m)+1]);
  28.   p^.NewInputTask;
  29.   if com > 15 then goto endoftask;
  30.   if commparams[com] and 1 = 1 then goto endoftask;
  31.   if commparams[com] and 2 = 0 then begin
  32.     asm
  33.       mov ah,4
  34.       les bx,[m]
  35.       mov dl,byte ptr es:[bx]
  36.       mov dh,0
  37.       mov bx,dx
  38.       push bx
  39.       int 14h
  40.       pop bx
  41.       cmp ax,$1954
  42.       jne @false
  43.       or byte ptr [bx+offset commparams],1
  44.     @false:
  45.     end;
  46.     if commparams[com] and 1 = 0 then goto endoftask;
  47.   end;
  48.   t^.hasexit := true;
  49.   repeat
  50.     repeat
  51.       asm
  52.         mov ax,$0C00
  53.         les di,[m]
  54.         mov dh,0
  55.         mov dl,byte ptr es:[di]
  56.         int $14
  57.         mov [w],ax
  58.       end;
  59.       if w <> $FFFF then begin
  60.         asm
  61.           mov ax,$0200
  62.           les di,[m]
  63.           mov dh,0
  64.           mov dl,byte ptr es:[di]
  65.           int $14
  66.           mov byte ptr [w],al
  67.         end;
  68.         p^.put(char(lo(w)));
  69.       end else break;
  70.     until false;
  71.     if Switch then break;
  72.   until false;
  73.   if commparams[com] and 2 = 0 then
  74.     asm
  75.       mov ah,5
  76.       mov dh,0
  77.       les bx,[m]
  78.       mov dl,byte ptr es:[bx]
  79.       mov dh,0
  80.       int $14
  81.     end;
  82.   maskbyte(commparams[com],1);
  83. endoftask:
  84.   p^.NoMoreInput;
  85.   freemem(@m,5)
  86. end;
  87.  
  88. procedure FossilOutTask(var m); far;
  89. var
  90.   com : byte absolute m;
  91.   p : pPipe;
  92.   ch : char;
  93. label endoftask;
  94. begin
  95.   p := pointer(meml[seg(m):ofs(m)+1]);
  96.   p^.NewOutputTask;
  97.   if com > 15 then goto endoftask;
  98.   if commparams[com] and 2 = 2 then goto endoftask;
  99.   if commparams[com] and 1 = 0 then begin
  100.     asm
  101.       mov ah,4
  102.       les bx,[m]
  103.       mov dl,byte ptr es:[bx]
  104.       mov dh,0
  105.       mov bx,dx
  106.       push bx
  107.       int 14h
  108.       pop bx
  109.       cmp ax,$1954
  110.       jne @false
  111.       or byte ptr es:[bx+offset commparams],2
  112.     @false:
  113.     end;
  114.     if commparams[com] and 2 = 0 then goto endoftask;
  115.   end;
  116.   t^.hasexit := true;
  117.   repeat
  118.     repeat
  119.       if p^.peek(ch) then begin
  120.         asm
  121.           mov ah,$0B
  122.           mov al,[&ch]
  123.           les di,[m]
  124.           mov dh,0
  125.           mov dl,byte ptr es:[di]
  126.           int $14
  127.           mov [&ch],al
  128.         end;
  129.         if ch = #1 then
  130.           ch := p^.Get
  131.         else break
  132.       end else break;
  133.     until false;
  134.     if Switch then break;
  135.   until false;
  136.   if commparams[com] and 1 = 0 then
  137.     asm
  138.       mov ah,5
  139.       mov dh,0
  140.       les bx,[m]
  141.       mov dl,byte ptr es:[bx]
  142.       mov dh,0
  143.       int $14
  144.     end;
  145.   maskbyte(commparams[com],2);
  146. endoftask:
  147.   p^.NoMoreOutput;
  148.   freemem(@m,5)
  149. end;
  150.  
  151. procedure AttachFossilInTask(com : byte; m : pPipe);
  152. var p,p1 : ^byte;
  153. begin
  154.   getmem(p,5); p1 := p; p^ := com;
  155.   inc(p); move(m,p^,4);
  156.   Fork(FossilInTask,2048,p1^
  157.   {$IFDEF DEBUG} ,'FossilIn $'+byte2fhex(com) {$ENDIF});
  158. end;
  159.  
  160. procedure AttachFossilOutTask(com : byte; m : pPipe);
  161. var p,p1 : ^byte;
  162. begin
  163.   getmem(p,5); p1 := p; p^ := com;
  164.   inc(p); move(m,p^,4);
  165.   Fork(FossilOutTask,2048,p1^
  166.     {$IFDEF DEBUG} ,'FossilOut $'+byte2fhex(com) {$ENDIF});
  167. end;
  168.  
  169. end.
  170.